﻿using System;
using System.Collections.Generic;
using System.Drawing;

namespace ERModelData
{
    /// <summary>Информация о трансформировании сущности</summary>
    public class TransformEssenceVisuality
    {
        /// <summary>Тип операции трансформирования</summary>
        private enum TypeTransform { Moving, Scale }
        /// <summary>Ключ трансформации</summary>
        private bool flag;
        /// <summary>Объект трансформации</summary>
        private Rectangle essence;
        /// <summary>Начальная точка трансформации</summary>
        private Point start;
        /// <summary>Тип трансформации</summary>
        private TypeTransform type;
        /// <summary>Смещение относительно верхней левой точки объекта трансформации</summary>
        private Point dStartTop;
        /// <summary>Маркеры объекта трансформации</summary>
        private MarkersTransformEssence marker;
        /// <summary>Начало процесса Перетаскивания объекта</summary>
        /// <param name="StartPos">Начальная позиция</param>
        /// <param name="Essence">Объект перетаскивания</param>
        public void StartMove(Point StartPos, Rectangle Essence)
        {
            flag = true;
            type = TypeTransform.Moving;
            start = StartPos;
            essence = Essence;
            dStartTop = new Point(start.X - essence.Location.X, start.Y - essence.Location.Y);
        }
        /// <summary>Начало процесса Масштабирования объекта</summary>
        /// <param name="StartPos">Начальная позиция</param>
        /// <param name="Essence">Объект масштабирования</param>
        /// <param name="ME">Маркеры этого объекта</param>
        public void StartScale(Point StartPos, Rectangle Essence, MarkersTransformEssence ME)
        {
            flag = true;
            type = TypeTransform.Scale;
            start = StartPos;
            essence = Essence;
            marker = ME;
        }
        /// <summary>Функция, сообщающая о ходе процесса</summary>
        /// <returns>Ключ процесса</returns>
        public bool IsProcces() { return flag; }
        /// <summary>Доступ к измененному объекту визуализации</summary>
        /// <returns>Объект визуализации</returns>
        public Rectangle GetObjectVisuality() { return essence; }
        /// <summary>Функция завершающая перетаскивание</summary>
        /// <returns>Конечный вид объекта перетаскивания</returns>
        public Rectangle EndTransform()
        {
            flag = false;
            return essence;
        }
        /// <summary>Процесс трансформации</summary>
        /// <param name="newPos">Новая позиция трансформации</param>
        public void Transform(Point newPos)
        {
            switch (type)
            {
                case TypeTransform.Moving: essence.Location = new Point(
                   start.X - (start.X - newPos.X) - dStartTop.X,
                   start.Y - (start.Y - newPos.Y) - dStartTop.Y
                   ); break;
                case TypeTransform.Scale:
                    {
                        Point location = essence.Location;
                        Size size = essence.Size;
                        if (marker.tip.Top) { size.Height -= newPos.Y - location.Y; location.Y = newPos.Y; }
                        if (marker.tip.Bottom) { size.Height += newPos.Y - (location.Y + essence.Height); }
                        if (marker.tip.Left) { size.Width -= newPos.X - location.X; location.X = newPos.X; }
                        if (marker.tip.Right) { size.Width += newPos.X - (location.X + essence.Width); }
                        essence.Location = location;
                        essence.Size = size;
                        break;
                    }
            }
        }
    }
}
